import javax.swing.JLabel;
import javax.swing.JSlider;
import javax.swing.JTable;
import javax.swing.JTextField;

public class HiloCantidad extends Thread {
	JLabel fondo;
	int posX, posY;
	Cliente cliente;
	Cola cola;
	Histograma histo;
	int lugar;
	char tipoCola;
	EntradaClientes ec;
	JTable jt_tabla_reportes;
	private long slider;
	//int c;


	public HiloCantidad(JLabel f, Histograma h, int lug, char tc,EntradaClientes ec, JTable jt_tabla_reportes, JSlider  slider) {
		fondo = f;
		cliente = new Cliente();
		histo = h;
		lugar = lug;
		tipoCola = tc;
		cola = new Cola(fondo, histo);
		posX = 0;
		posY = 0;
		this.ec=ec;
		this.jt_tabla_reportes=jt_tabla_reportes;
		this.slider = 100/Long.parseLong(Integer.toString(slider.getValue()));
		//elocidad_simulacion = 100/Long.parseLong(jtf_velocidad_simulacion.getText());
		
	}

	/*---------------------------- 2 -------------------------------------*/
	public boolean repartirAtencionTomador() {
		boolean envio = false;
		int porcentaje = (int) (Math.random() * 100) + 1;
		if (porcentaje <= 70)
			envio = true;
		else
			envio = false;
		return envio;
	}

	/*---------------------------- 3 -------------------------------------*/
	public boolean repartirAtencionCaja() {
		boolean envio = false;
		int porcentaje = (int) (Math.random() * 100) + 1;
		if (porcentaje <= 30)
			envio = true;
		else
			envio = false;
		return envio;
	}

	public void moverPosicion(int col) {
		cliente.CambiarImagE();
		int posX = cliente.getX();
		if (col == 0) {
			for (int j = posX; j < posX + 25; j++) {
				cliente.setLocation(j, 430);
				fondo.add(cliente);
				try {
					Thread.sleep(10);
				} catch (Exception e) {
				}
			}
		} else {
			for (int j = posX; j < posX + 25; j++) {
				cliente.setLocation(j, 80);
				fondo.add(cliente);
				try {
					Thread.sleep(1000);
				} catch (Exception e) {
				}
			}
		}
		cliente.cambiarParado();
	}

	public void luegoAtencionTomador() {
		boolean repartir = repartirAtencionTomador();
		@SuppressWarnings("unused")
		int posFinal = 0;
		if (repartir == true) {
			
			caminaAbajo(513,430,500);
			caminaDerecho(513,500,700);
			caminaArriba(700,500,360);
			caminaDerecho(700,360,780);
			System.out.println ("El cliente esta saliendo de Tomador de Apuestas");
			cliente.cambiarFalso();

		}/* else {
			cliente.CambiarImagNO();
			for (int i = 513, j = 430; i > 130 && j > 80; i--, j--) {
				cliente.setLocation(i, j);
				fondo.add(cliente);
				try {
					Thread.sleep(1000);
				} catch (Exception e) {
				}

			}			
			movimCajaEste();
		}*/
	}

	public void caminaDerecho(int x, int y, int l){
		cliente.CambiarImagE();
		try{
			for(int i=x;i<l;i++){
		
			cliente.setLocation(i, y);
			fondo.add(cliente);
			Thread.sleep(5);
			fondo.repaint();
			}
		}
		catch (InterruptedException e){}
		
				
	}
	public void caminaAbajo(int x, int y, int l){
		cliente.CambiarImagS();
		try{
			for(int i=y;i<l;i++){
				cliente.setLocation(x,i);
				fondo.add(cliente);
				Thread.sleep(5);
				fondo.repaint();
			}
			
		}
		catch (InterruptedException e){}
	}
	public void caminaArriba(int x, int y,int l){
		cliente.CambiarImagN();
		try{
			for(int i=y;i>l;i--){
				cliente.setLocation(x,i);
				fondo.add(cliente);
				Thread.sleep(5);
				fondo.repaint();
			}
			
		}
		catch (InterruptedException e){}
		
	}
	
	public void movimCajaEste() {
		int posFinal = 0;
		int posLibre = 0;
		cliente.CambiarImagE();
		
		// coby_master ==> incrementando el numero de clientes que entran a caja		
		jt_tabla_reportes.setValueAt(ec.getClientes_entran_caja(),8, 1);
		ec.incrementar_Cli_Entran_Caja();
		
		for (int j = 130; j < 263; j++) {
			cliente.setLocation(j, 80);
			fondo.add(cliente);
			try {
				Thread.sleep(slider);
			} catch (Exception e) {
			}
		}
		
		posFinal = cola.buscarVacio(1);
		if (posFinal == 0)
			movimCajaSalida();
		else {

			for (int j = 263; j < posFinal; j++) {
				cliente.setLocation(j, 80);
				fondo.add(cliente);
				try {
					Thread.sleep(slider);
				} catch (Exception e) {
				}
			}
			cliente.cambiarParado();
			try {
				Thread.sleep(10000);
			} catch (Exception e) {
			}

			if (cliente.getX() == 513) {
				histo.fijarEstadoPuesto(1, 0, false);
				luegoAtencionCaja();
			} else {
				while (cliente.getX() < 488) {
					posLibre = cola.marcarVacio(1, cliente.getX());
					histo.fijarEstadoPuesto(1, posLibre, false);
					moverPosicion(1);
					posFinal = cola.buscarVacio(1);

					try {
						Thread.sleep(10000);
					} catch (Exception e) {
					}
				}
				luegoAtencionCaja();
			}
		}
	}

	public void luegoAtencionCaja() {
		boolean repartir = repartirAtencionCaja();
		@SuppressWarnings("unused")
		int posFinal = 0;
		if (repartir == true) {
			
			 caminaArriba(513,80,10);
			 caminaDerecho(513,10,700);
			 caminaAbajo(700,10,150);
			 caminaDerecho(700,150,780);
			 
			
			System.out.println ("El cliente esta saliendo de Caja");
			
			cliente.cambiarFalso();

		} /*else {
			cliente.CambiarImagSO();
			for (int i = 513, j = 80; i > 130 && j < 430; i--, j++) {
				cliente.setLocation(i, j);
				fondo.add(cliente);
				try {
					Thread.sleep(velocidad_simulacion);// Velocidad para entrar a la oficina
				} catch (Exception e) {
				}
			}
			// System.out.println ("El cliente se dirije a EstadoCuenta desde
			// Caja");
			movimEstadoEste();
		}*/
	}

	public void movimEstadoEste() {
		int posFinal = 0;
		int posLibre = 0;
		cliente.CambiarImagE();
		
		// coby_master incremento de clientes que entran a estado de cuenta		
		jt_tabla_reportes.setValueAt(ec.getClientes_entran_ta(),15,1);
		ec.incrementar_Cli_Entran_TA();
		
		for (int j = 130; j < 263; j++) {
			cliente.setLocation(j, 430);
			fondo.add(cliente);
			try {
				Thread.sleep(slider);
			} catch (Exception e) {
			}
		}
		/* ........................................................... */
		posFinal = cola.buscarVacio(0);
		if (posFinal == 0)
			movimEstadoSalida();
		else {
			for (int j = 263; j < posFinal; j++) {
				cliente.setLocation(j, 430);
				fondo.add(cliente);
				try {
					Thread.sleep(slider);
				} catch (Exception e) {
				}
			}
			cliente.cambiarParado();
			try {
				Thread.sleep(5000);
			} catch (Exception e) {
			}

			if (cliente.getX() == 513) {
				histo.fijarEstadoPuesto(0, 0, false);
				luegoAtencionTomador();
			} else {
				while (cliente.getX() < 488) {
					posLibre = cola.marcarVacio(0, cliente.getX());
					histo.fijarEstadoPuesto(0, posLibre, false);
					moverPosicion(0);
					posFinal = cola.buscarVacio(0);

					try {
						Thread.sleep(5000);
					} catch (Exception e) {
					}
				}
				luegoAtencionTomador();
			}
		}
	}

	public void movimEstadoSalida() {
		cliente.CambiarImagS();
		for (int j = 430; j < 490; j++) {
			cliente.setLocation(263, j);
			fondo.add(cliente);
			try {
				Thread.sleep(slider);
			} catch (Exception e) {
			}
		}
		cliente.CambiarImagE();
		for (int j = 263; j < 650; j++) {
			cliente.setLocation(j, 490);
			fondo.add(cliente);
			try {
				Thread.sleep(slider);
			} catch (Exception e) {
			}
		}
		cliente.CambiarImagN();
		for (int j = 490; j > 360; j--) {
			cliente.setLocation(650, j);
			fondo.add(cliente);
			try {
				Thread.sleep(slider);
			} catch (Exception e) {
			}
		}
		cliente.CambiarImagE();
		for (int j = 650; j < 780; j++) {
			cliente.setLocation(j, 360);
			fondo.add(cliente);
			try {
				Thread.sleep(slider);
			} catch (Exception e) {
			}
		}
		// System.out.println ("El cliente esta saliendo de EstadoCuenta porque
		// la cola esta muy llena");
		cliente.cambiarFalso();

	}

	public void movimCajaSalida() {
		cliente.CambiarImagN();
		for (int j = 80; j > 20; j--) {
			cliente.setLocation(263, j);
			fondo.add(cliente);
			try {
				Thread.sleep(slider);
			} catch (Exception e) {
			}
		}
		cliente.CambiarImagE();
		for (int j = 263; j < 650; j++) {
			cliente.setLocation(j, 20);
			fondo.add(cliente);
			try {
				Thread.sleep(slider);
			} catch (Exception e) {
			}
		}
		cliente.CambiarImagS();
		for (int j = 20; j < 150; j++) {
			cliente.setLocation(650, j);
			fondo.add(cliente);
			try {
				Thread.sleep(slider);// Velocidad para entrar a la oficina
			} catch (Exception e) {
			}
		}
		cliente.CambiarImagE();
		for (int j = 650; j < 780; j++) {
			cliente.setLocation(j, 150);
			fondo.add(cliente);
			try {
				Thread.sleep(slider);
			} catch (Exception e) {
			}
		}
		// System.out.println ("El cliente esta saliendo de Caja porque la cola
		// esta muy llena");
		cliente.cambiarFalso();

	}

	public void run() {
		cliente.cambiarParado();
		int posLibre = 0;
		@SuppressWarnings("unused")
		int posFinal = 0;
		if (tipoCola == 'c') {
			while (cliente.getX() < 488) {
				posLibre = cola.marcarVacio(1, cliente.getX());
				histo.fijarEstadoPuesto(1, posLibre, false);
				moverPosicion(1);
				posFinal = cola.buscarVacio(1);

				try {
					Thread.sleep(5000);
				} catch (Exception e) {
				}
			}
			luegoAtencionCaja();

		} else {

			while (cliente.getX() < 488) {
				posLibre = cola.marcarVacio(0, cliente.getX());
				histo.fijarEstadoPuesto(0, posLibre, false);
				moverPosicion(0);
				posFinal = cola.buscarVacio(0);

				try {
					Thread.sleep(2500);
				} catch (Exception e) {
				}
			}
			luegoAtencionTomador();

		}

	}
}